package com.mall.module.user.service;

import com.mall.common.model.PageResult;
import com.mall.module.user.domain.vo.BalanceRecordVO;
import com.mall.module.user.domain.vo.PointsRecordVO;
import com.mall.module.user.domain.vo.UserAssetVO;

import java.math.BigDecimal;

public interface UserAssetService {

    /**
     * 获取用户资产信息
     *
     * @param userId 用户ID
     * @return 用户资产信息
     */
    UserAssetVO getUserAsset(Long userId);

    /**
     * 初始化用户资产
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean initUserAsset(Long userId);

    /**
     * 增加用户余额
     *
     * @param userId 用户ID
     * @param amount 增加金额
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean increaseBalance(Long userId, BigDecimal amount, String reason, String orderSn);

    /**
     * 减少用户余额
     *
     * @param userId 用户ID
     * @param amount 减少金额
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean decreaseBalance(Long userId, BigDecimal amount, String reason, String orderSn);

    /**
     * 增加用户积分
     *
     * @param userId 用户ID
     * @param points 增加积分
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean increasePoints(Long userId, Integer points, String reason, String orderSn);

    /**
     * 减少用户积分
     *
     * @param userId 用户ID
     * @param points 减少积分
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean decreasePoints(Long userId, Integer points, String reason, String orderSn);

    /**
     * 冻结用户余额
     *
     * @param userId 用户ID
     * @param amount 冻结金额
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean freezeBalance(Long userId, BigDecimal amount, String reason, String orderSn);

    /**
     * 解冻用户余额
     *
     * @param userId 用户ID
     * @param amount 解冻金额
     * @param reason 变动原因
     * @param orderSn 关联订单号
     * @return 是否成功
     */
    boolean unfreezeBalance(Long userId, BigDecimal amount, String reason, String orderSn);

    /**
     * 获取用户余额记录
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页数量
     * @return 余额记录
     */
    PageResult<BalanceRecordVO> getBalanceRecord(Long userId, Integer page, Integer size);

    /**
     * 获取用户积分记录
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页数量
     * @return 积分记录
     */
    PageResult<PointsRecordVO> getPointsRecord(Long userId, Integer page, Integer size);
} 